import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;

@Slf4j
public class TagComponent {


    private TagService tagService;

    /**
     * 绑定标签，巧用Function<T,R> 和 BiConsumer<T,U>两个函数
     * @param list 数据元素
     * @param buzType 业务类型
     * @param function Function<T,R>
     * @param consumer BiConsumer<T,U>
     * @param <T> 集合元素
     * @param <R> 集合元素属性
     */
    public  <T,R>  void bindTags(List<T> list, Integer buzType, Function<T,R> function, BiConsumer<T,List<String>> consumer){
        try {
            //1、构建查询参数，只需要业务类型集合
            TagParam form = new TagParam();
            form.setBuzType(buzType);
            //2、查询对应业务类型标签
            List<Tag> tagList = tagService.queryTags(form);
            if(!tagList.isEmpty()){
                //3、构建Map，key=业务id，value=标签
                Map<Integer,String> tagMap = tagList.stream().collect(Collectors.toMap(Tag::getSourceId,Tag::getTags));
                list.forEach(rule -> {
                    //4、获取对应业务id的标签
                    String tags = tagMap.get(function.apply(rule));
                    if(null != tags && tags.length() > 0){
                        //5、回调处理，把数据标签集合以及集合元素给调用处理
                        consumer.accept(rule, Arrays.asList(tags.split(",")));
                    }
                });
            }
        } catch (Exception e) {
            //log.error("设置标签异常,tuple={}",e);
        }
    }
}